package cifras;

import java.util.ArrayList;
import java.util.List;

import aima.search.framework.Successor;
import aima.search.framework.SuccessorFunction;

public class CifrasSuccessorFunction implements SuccessorFunction{

	@SuppressWarnings("unchecked")
	@Override
	public List getSuccessors(Object state) {
		
		// Creamos la lista donde almacenar los estados sucesores
		List<Successor> successors = new ArrayList<Successor>();
		
		CifrasEstado estadoActual = (CifrasEstado) state;
		
		CifrasEstado nuevoEstado = null;
		
		// Por cada cifra...
		for (int i=0; i < CifrasEstado.CIFRAS; i++){
			if (estadoActual.esPosibleOperar(i)){
				// ...se crea un estado nuevo (copia del actual)...
				nuevoEstado = new CifrasEstado(estadoActual);
				// ...se suma la cifra elegida...
				nuevoEstado.operar(i, '+');
				// ...y se almacena en la lista de sucesores
				successors.add(new Successor("Operacion: + " + i, nuevoEstado));
				
				// ...se crea un estado nuevo (copia del actual)...
				nuevoEstado = new CifrasEstado(estadoActual);
				// ...se resta la cifra elegida...
				nuevoEstado.operar(i, '-');
				// ...y se almacena en la lista de sucesores
				successors.add(new Successor("Operacion: - " + i, nuevoEstado));
				
				// ...se crea un estado nuevo (copia del actual)...
				nuevoEstado = new CifrasEstado(estadoActual);
				// ...se multiplica la cifra elegida...
				nuevoEstado.operar(i, '*');
				// ...y se almacena en la lista de sucesores
				successors.add(new Successor("Operacion: * " + i, nuevoEstado));
				
				// ...se crea un estado nuevo (copia del actual)...
				nuevoEstado = new CifrasEstado(estadoActual);
				// ...se divide la cifra elegida...
				nuevoEstado.operar(i, '/');
				// ...y se almacena en la lista de sucesores
				successors.add(new Successor("Operacion: / " + i, nuevoEstado));
			}
		}
		
		return successors;
	}

}
